<?php

namespace  Procesos\Cargador\Workflow;

use Entidades\Workflow\Descripcion\Red,
	Entidades\Workflow\Descripcion\Lugar,
	Entidades\Workflow\Descripcion\Transicion,
	Entidades\Workflow\Descripcion\Arco;


class NetworkHandler extends BaseHandler {
	/**
	 * @type Transicion
	 */
	private $transicionActual;

	// ----------------------------------------
	// Props Methods
	// ----------------------------------------
	/**
	 * @type Red
	 */
	private $red;
	
	/**
	 * @type Lugar
	 */
	private $lugarActual;

	/**	 
	 * @type Arco
	 */
	private $arc;
	
	/**$attributes['id']
	 * @type string
	 */
	private $valorActual;
	
	/**
	 * @type int
	 */
	private $condicionMarcacionInicial = 0;
	
	/**
	 * @type int
	 */
	private $operacion = 0;
	
	/**
	 * @type array
	 */
	private $nodesById = array();
	
	/**
	 * @type array
	 */
	private $tipoDeNodo = array();
	

	// ----------------------------------------

	public function __construct() {
		$this->red =  new Red();
	}

	// ----------------------------------------
	// Handler Methods
	// ----------------------------------------

	private function networkBeg($parser, $tag, $attributes) {
		$this->red->setNombre($attributes['id']);
	}

	private function placeBeg($parser, $tag, $attributes) {
		$lugar = new Lugar;
		$this->lugarActual = $lugar;
		$this->nodesById[$attributes['id']] = $lugar;
		$this->tipoDeNodo[$attributes['id']] = 1;
		$lugar->setIdentificador($attributes['id']);
		$this->red->asignarLugar($lugar);

	}

	private function transBeg($parser, $tag, $attributes) {
		$this->transicionActual = new Transicion;
		$this->transicionActual->setIdentificador($attributes['id']);
		$this->nodesById[$attributes['id']] = $this->transicionActual;	
		$this->tipoDeNodo[$attributes['id']] = 0;
		$this->transicionActual->setTipo(3); // automatica por defecto.
		$this->red->asignarTransicion($this->transicionActual);
	}

	
	private function arcBeg( $parser, $tag, $attributes) {
		if (!isset ($this->nodesById[$attributes['source']])) {
			print ("source node not found");
			die();
		}
		if (!isset ($this->nodesById[$attributes['target']])) {
			print ("target node not found");
			die();
		}
		
		
		$origen =  $this->nodesById[$attributes['source']];
		$destino =  $this->nodesById[$attributes['target']];

		$lugar = NULL;
		$trans = NULL;
		$tipoDeArco = NULL;
		


		if ($this->tipoDeNodo[$attributes['source']] == 1) {
			$lugar =  $origen;
			$trans =  $destino;
			$tipoDeArco = 0; // arco de entrada
		} else {
			$lugar =  $destino;
			$trans =  $origen;
			$tipoDeArco = 1; // arco de salida
		}
		
		


		$this->arc = new Arco();
		$this->arc->setIdentificador($attributes['id']);
		$this->arc->setTipoDeArco($tipoDeArco);
		$this->arc->setTipoInhibidor(0);

		if($tipoDeArco == 0) {
			$this->arc->asociarLugarDeEntrada($lugar);
			$this->arc->asociarTransicionDeEntrada($trans);
		}
		else {
			$this->arc->asociarLugarDeSalida($lugar);
			$this->arc->asociarTransicionDeSalida($trans);
		}
		$this->red->asignarArco($this->arc);
	}

	private function triggerBeg($parser, $tag, $attributes) {
		$rol = $attributes['id'];
		$tipo =$attributes['type'];
		if($tipo == 200) $tipo = 0; // por usuario
		if($tipo == 201) $tipo = 1; // por mensaje
		if($tipo == 202) $tipo = 2; // por tiempo
		$this->transicionActual->setTipo($tipo);

		if($tipo == 0) {
			$this->transicionActual->setNombreRol($rol);
			$salida = "rol ". $rol . "\n";
			print $salida;
		}
	}
	
	
	
	private function supervisorEnd( $parser, $tag) {
		$this->transicionActual->setSupervisor($this->text);
	}

	private function methodClassEnd( $parser, $tag) {
		$this->transicionActual->setMethodClass($this->text);
	}


	private function methodsEnd($parser, $tag) {
		$this->transicionActual->setMethods($this->text);
	}				
	
	
	private function nameEnd($parser,$tag) {
		switch ($this->operacion){
			
			case 2 : 
				$this->lugarActual->setNombre($this->valorActual);
				break;
			case 3:
				$this->transicionActual->setNombre($this->valorActual);
				break;
		}
	}
	
	private function textEnd($parser,$tag) {
		$this->valorActual = $this->text;
	}
	
	private function initialMarkingEnd($parser, $tag){
		$this->lugarActual->setMarcacionInicial($this->text);
	}
	
	private function inscriptionEnd($parser, $tag) {
		$this->arc->setPeso($this->text);
	}
	// ----------------------------------------
	// BaseHandler Methods
	// ----------------------------------------

	public function startElement($parser, $tag, $attributes) {
		parent :: startElement($parser, $tag, $attributes);
		switch ($tag) {
			case 'net' :
				$this->networkBeg($parser, $tag, $attributes);
				$this->operacion = 1;
				break;
			case 'trigger' :
				$this->triggerBeg($parser,$tag, $attributes);
				break;	
			case 'place' :
				$this->placeBeg($parser, $tag, $attributes);
				$this->operacion = 2;
				break;
			case 'transition' :
				$this->transBeg($parser, $tag, $attributes);
				$this->operacion = 3;
				break;
			case 'arc' :
				$this->arcBeg($parser, $tag, $attributes);
				$this->operacion = 4;
				break;
		}
	}

	public function endElement($parser, $tag) {
		parent :: endElement($parser, $tag);
		switch ($tag) {
			case 'supervisor' :
				$this->supervisorEnd($parser, $tag);
				break;
			case 'agent' :
				$this->agentEnd($parser, $tag);
				break;
			case 'methodClass' :
				$this->methodClassEnd($parser, $tag);
				break;
			case 'name' :
				$this->nameEnd($parser, $tag);
				break;
			case 'text' :
				$this->textEnd($parser, $tag);
				break;
			case 'inscription' :
				$this->inscriptionEnd($parser, $tag);
				break;
			case 'initialMarking' :
				$this->initialMarkingEnd($parser, $tag);
				break;
		}
	}

	// ----------------------------------------
	// Props Methods
	// ----------------------------------------
	/**
	 * @return MNetwork
	 */
	public function getNetwork() {
		return $this->red;
	}
	/**
	 * @return array
	 */
	public function getNodesById() {
		return $this->nodesById;
	}
}
?>
